perm filename WINT1.SAI[VIS,HPM]1 blob sn#110600 filedate 1974-07-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "WINTER"
C00008 00003	FIND HORIZON
C00012 ENDMK
C⊗;
BEGIN "WINTER"
REQUIRE "WINNIC.SAI[VIS,HPM]" SOURCE_FILE;

INTEGER ARRAY CHAN[0:5],FEAT[1:3,1:4,1:60];
INTEGER DX1,DY1,DX2,DY2,SCANS,SCANX,SCANY,ERRX,ERRY,H,BST,T,BSTBST;
INTEGER WINDOW,I,J,MAC,NP,PC,NF;
REAL SUM,TX,TY,T0,X,Y,XU,YU,TXP,TYP;
STRING ARRAY FILN[1:4],TAIL[1:4];
REAL ARRAY POS[1:2,1:4];

PROCEDURE FLUSH(INTEGER F,PIC); COMMENT FORGET A FEATURE;
 BEGIN REAL X,Y,XU,YU;
 X←(FEAT[1,PIC,F]-1)/PICWID+POS[1,PIC]; XU←X+TXP;
 Y←(FEAT[2,PIC,F]-1)/PICHIG+POS[2,PIC]; YU←Y+TYP;
 DRKEN;
 LINE(X,Y,XU,Y);
 LINE(XU,Y,XU,YU);
 LINE(XU,YU,X,YU);
 LINE(X,YU,X,Y);
 LITEN;
 END;

PROCEDURE SHOW(INTEGER F,PIC); COMMENT DISPLAY A FEATURE;
 BEGIN REAL X,Y,XU,YU;
 X←(FEAT[1,PIC,F]-1)/PICWID+POS[1,PIC]; XU←X+TXP;
 Y←(FEAT[2,PIC,F]-1)/PICHIG+POS[2,PIC]; YU←Y+TYP;
 LITEN;
 LINE(X,Y,XU,Y);
 LINE(XU,Y,XU,YU);
 LINE(XU,YU,X,YU);
 LINE(X,YU,X,Y);
 TXTPOS(X-.02,Y+.04,.02,-.04); TEXT(F+'100);
 END;


POS[1,1]←-1.1; POS[2,1]←-1.1; POS[1,2]←-1.1; POS[2,2]←.1; NP←2;
CHAN[0]←'32; CHAN[1]←'37; CHAN[2]←'33; CHAN[3]←'34; CHAN[4]←'35; CHAN[5]←'36;
FOR I←0 STEP 1 UNTIL 5 DO GDDCHN(CHAN[I]);
DDINIT; SCREEN(-1.13,1.2,1,-1.2); DRKEN; RECTAN(-2,-2,2,2);


FOR PC←1 STEP 1 UNTIL NP DO
DO OUTSTR("FILE "&CVS(PC)&":") UNTIL
 	PIXDIM((FILN[PC]←INCHWL)&
		(TAIL[PC]←(IF FILN[PC][∞ TO ∞]="]" THEN "" ELSE ".TMP[DAT,BGB]")));
OUTSTR("WINDOW SIZE:"); WINDOW←CVD(INCHWL); INIWIN(WINDOW);

OUTSTR("PICSIZ "&CVS(PICSIZ)&
 "  WIDTH "&CVS(PICWID)&"  HEIGHT "&CVS(PICHIG)&"  WINDOW "&CVS(WINDOW)&
 "  VERWIN "&CVS(VERWIN)&"  HORWIN "&CVS(HORWIN)&'15&'12);

 BEGIN
 INTEGER ARRAY PIC[1:NP,1:PICSIZ],WINS[-1:VERWIN,1:HORWIN];
 TX←WINDOW/PICWID; TXP←(WINDOW-1)/PICWID;
 TY←WINDOW/PICHIG; TYP←(WINDOW-1)/PICHIG;

 FOR PC←1 STEP 1 UNTIL NP DO
  BEGIN
  PIXDIM(FILN[PC]&TAIL[PC]);
  GETPIX(PIC[PC,1]); IF PC=1 THEN CLEAN(PIC[PC,1]);
  END;

 OUTSTR("DISPLAY?"); IF INCHWL="Y" THEN
  BEGIN
  FOR I←1 STEP 1 UNTIL 5 DO DPYUP('36);

  FOR PC←1 STEP 1 UNTIL NP DO
   BEGIN
   LITEN; TXTPOS(POS[1,PC],POS[2,PC]+1.2,.04,-.08); TEXT(FILN[PC]); DRKEN;
   END;

  FOR I←4 STEP -1 UNTIL (5-PICBIT) MAX 0 DO
   BEGIN
   FOR PC←1 STEP 1 UNTIL NP DO
    BEGIN
    RECTAN(POS[1,PC],POS[2,PC],POS[1,PC]+1,POS[2,PC]+1);
    VIDEO(POS[1,PC],POS[2,PC],POS[1,PC]+1,POS[2,PC]+1,PIC[PC,1],2↑(PICBIT+I-5));
    END;
   FOR J←1 STEP 1 UNTIL 5 DO DPYUP(CHAN[I]);
   END;
  END;

 RECTAN(-2,-2,2,2); LITEN;
 FOR J←0 STEP 1 UNTIL HORWIN DO
  BEGIN
  X←J*TX+POS[1,1];
  LINE(X,POS[2,1],X,POS[2,1]-.02);
  LINE(X,POS[2,1]+1,X,POS[2,1]+1.02);
  END;
 FOR I←0 STEP 1 UNTIL VERWIN DO
  BEGIN
  Y←I*TY+POS[2,1];
  LINE(POS[1,1],Y,POS[1,1]-.02,Y);
  LINE(POS[1,1]+1,Y,POS[1,1]+1.02,Y);
  END;

 DPYUP(CHAN[5]);
 SETFORMAT(0,2);
 T0←CALL(0,"RUNTIM"); SUM←DOWIN(PIC[1,1],WINS[1,1]); 
 OUTSTR("TIME "&CVF((CALL(0,"RUNTIM")-T0)/1000)&'15&'12);

 NF←0;
 FOR I←2 STEP 1 UNTIL VERWIN-3 DO
 FOR J←3 STEP 1 UNTIL HORWIN-2 DO
  BEGIN  INTEGER II,JJ,WMAX;
  X←(J-1)*TX+POS[1,1];
  Y←(I-1)*TY+POS[2,1];
  IF (WINS[I,J] LAND 1)=0 ∧ WINS[I,J]>SUM THEN
   BEGIN
   FEAT[1,1,NF←NF+1]←(J-1)*WINDOW+1;
   FEAT[2,1,NF]←(I-1)*WINDOW+1;
   FEAT[3,1,NF]←WINS[I,J];
   SHOW(NF,1);
   DPYUP(CHAN[5]);
   END;
  END;

 FOR I←1 STEP 1 UNTIL 5 DO DPYUP(CHAN[5]);
COMMENT FIND HORIZON;
BSTBST←'377777000000;
 DO
  BEGIN
  H←1; BST←0;
  FOR I←1 STEP 1 UNTIL NF%2 DO
  IF FEAT[3,1,I]>BST ∧ FEAT[3,1,I]<BSTBST ∧
     FEAT[1,1,I]≥PICWID/3 ∧ FEAT[1,1,I]≤2*PICWID/3 THEN
	BEGIN H←I; BST←FEAT[3,1,I]; END;
  BSTBST←BST;
  SCANY←10; SCANX←60;
  DX1←1 MAX (FEAT[1,1,H]-SCANX);
  DY1←1 MAX (FEAT[2,1,H]-SCANY);
  DX2←PICWID MIN (FEAT[1,1,H]+SCANX+WINDOW-1);
  DY2←PICHIG MIN (FEAT[2,1,H]+SCANY+WINDOW-1);
  T←BSTCOR(PIC[1,1],FEAT[1,1,H],FEAT[2,1,H],FEAT[1,1,H]+WINDOW-1,
		FEAT[2,1,H]+WINDOW-1,PIC[2,1],DX1,DY1,DX2,DY2);
  FEAT[1,2,H]←DX1; FEAT[2,2,H]←DY1; FEAT[3,2,H]←T;
  END UNTIL T≤10∨BST=0;
 IF BST=0 THEN OUTSTR("COULDN'T LOCATE HORIZON"&'15&'12)
 ELSE
  BEGIN
  SHOW(H,2);
  FOR J←1,2 DO
   BEGIN
   X←(FEAT[1,J,H]-FEAT[1,1,H])/PICWID+POS[1,J]+.5;
   Y←(FEAT[2,J,H]-FEAT[2,1,H])/PICHIG+POS[2,J]+.5;
   YU←POS[2,J]; XU←POS[1,J];
   LINE(X,YU,X,YU+1); LINE(XU,Y,XU+1,Y);
   END;
  TXTPOS(.2,H*.08-1,.05,-.07); TEXT("HORIZON "&CVS(T));
  FOR J←1,2,3 DO DPYUP(CHAN[5]);
  ERRX←DX1-FEAT[1,1,H]; ERRY←DY1-FEAT[2,1,H];

 COMMENT NOW FIND OTHER FEATURES;

  FOR I←1 STEP 1 UNTIL NF DO IF I≠H THEN
   BEGIN 
   SCANX←15; SCANY←15;
   DX1←1 MAX (FEAT[1,1,I]+ERRX-SCANX);
   DY1←1 MAX (FEAT[2,1,I]+ERRY-SCANY);
   DX2←PICWID MIN (FEAT[1,1,I]+ERRX+SCANX+WINDOW);
   DY2←PICHIG MIN (FEAT[2,1,I]+ERRY+SCANY+WINDOW);
   T←BSTCOR(PIC[1,1],FEAT[1,1,I],FEAT[2,1,I],FEAT[1,1,I]+WINDOW-1,
		FEAT[2,1,I]+WINDOW-1,PIC[2,1],DX1,DY1,DX2,DY2);
   FEAT[1,2,I]←DX1; FEAT[2,2,I]←DY1; FEAT[3,2,I]←T;
   TXTPOS(.2,I*.08-1,.05,-.07);TEXT(('100+I)&" - "&CVS(T)&'15&'12);
   IF T>10 THEN FLUSH(I,1) ELSE SHOW(I,2);
   FOR J←1,2,3 DO DPYUP(CHAN[5]);
   END;

  FOR I←1,2,3 DO DPYUP(CHAN[5]);
  END;

 MAKPIX(VERWIN,HORWIN,6);
  BEGIN
  INTEGER ARRAY POUT[1:PICSIZ];
  FOR I←1 STEP 1 UNTIL VERWIN DO FOR J←1 STEP 1 UNTIL HORWIN
			DO PUTEL(POUT[1],I,J,63*SQRT(WINS[I,J]/MAC));
  PUTPIX(POUT[1],"TMP.TMP");
  END;

 END;

END;